home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / elevator.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.8 KB  |  213 lines

  1. #ifndef _LINUX_ELEVATOR_H
  2. #define _LINUX_ELEVATOR_H
  3.  
  4. #include <linux/percpu.h>
  5.  
  6. #ifdef CONFIG_BLOCK
  7.  
  8. typedef int (elevator_merge_fn) (struct request_queue *, struct request **,
  9.                  struct bio *);
  10.  
  11. typedef void (elevator_merge_req_fn) (struct request_queue *, struct request *, struct request *);
  12.  
  13. typedef void (elevator_merged_fn) (struct request_queue *, struct request *, int);
  14.  
  15. typedef int (elevator_allow_merge_fn) (struct request_queue *, struct request *, struct bio *);
  16.  
  17. typedef int (elevator_dispatch_fn) (struct request_queue *, int);
  18.  
  19. typedef void (elevator_add_req_fn) (struct request_queue *, struct request *);
  20. typedef int (elevator_queue_empty_fn) (struct request_queue *);
  21. typedef struct request *(elevator_request_list_fn) (struct request_queue *, struct request *);
  22. typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *);
  23. typedef int (elevator_may_queue_fn) (struct request_queue *, int);
  24.  
  25. typedef int (elevator_set_req_fn) (struct request_queue *, struct request *, gfp_t);
  26. typedef void (elevator_put_req_fn) (struct request *);
  27. typedef void (elevator_activate_req_fn) (struct request_queue *, struct request *);
  28. typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct request *);
  29.  
  30. typedef void *(elevator_init_fn) (struct request_queue *);
  31. typedef void (elevator_exit_fn) (elevator_t *);
  32.  
  33. struct elevator_ops
  34. {
  35.     elevator_merge_fn *elevator_merge_fn;
  36.     elevator_merged_fn *elevator_merged_fn;
  37.     elevator_merge_req_fn *elevator_merge_req_fn;
  38.     elevator_allow_merge_fn *elevator_allow_merge_fn;
  39.  
  40.     elevator_dispatch_fn *elevator_dispatch_fn;
  41.     elevator_add_req_fn *elevator_add_req_fn;
  42.     elevator_activate_req_fn *elevator_activate_req_fn;
  43.     elevator_deactivate_req_fn *elevator_deactivate_req_fn;
  44.  
  45.     elevator_queue_empty_fn *elevator_queue_empty_fn;
  46.     elevator_completed_req_fn *elevator_completed_req_fn;
  47.  
  48.     elevator_request_list_fn *elevator_former_req_fn;
  49.     elevator_request_list_fn *elevator_latter_req_fn;
  50.  
  51.     elevator_set_req_fn *elevator_set_req_fn;
  52.     elevator_put_req_fn *elevator_put_req_fn;
  53.  
  54.     elevator_may_queue_fn *elevator_may_queue_fn;
  55.  
  56.     elevator_init_fn *elevator_init_fn;
  57.     elevator_exit_fn *elevator_exit_fn;
  58.     void (*trim)(struct io_context *);
  59. };
  60.  
  61. #define ELV_NAME_MAX    (16)
  62.  
  63. struct elv_fs_entry {
  64.     struct attribute attr;
  65.     ssize_t (*show)(elevator_t *, char *);
  66.     ssize_t (*store)(elevator_t *, const char *, size_t);
  67. };
  68.  
  69. /*
  70.  * identifies an elevator type, such as AS or deadline
  71.  */
  72. struct elevator_type
  73. {
  74.     struct list_head list;
  75.     struct elevator_ops ops;
  76.     struct elv_fs_entry *elevator_attrs;
  77.     char elevator_name[ELV_NAME_MAX];
  78.     struct module *elevator_owner;
  79. };
  80.  
  81. /*
  82.  * each queue has an elevator_queue associated with it
  83.  */
  84. struct elevator_queue
  85. {
  86.     struct elevator_ops *ops;
  87.     void *elevator_data;
  88.     struct kobject kobj;
  89.     struct elevator_type *elevator_type;
  90.     struct mutex sysfs_lock;
  91.     struct hlist_head *hash;
  92. };
  93.  
  94. /*
  95.  * block elevator interface
  96.  */
  97. extern void elv_dispatch_sort(struct request_queue *, struct request *);
  98. extern void elv_dispatch_add_tail(struct request_queue *, struct request *);
  99. extern void elv_add_request(struct request_queue *, struct request *, int, int);
  100. extern void __elv_add_request(struct request_queue *, struct request *, int, int);
  101. extern void elv_insert(struct request_queue *, struct request *, int);
  102. extern int elv_merge(struct request_queue *, struct request **, struct bio *);
  103. extern void elv_merge_requests(struct request_queue *, struct request *,
  104.                    struct request *);
  105. extern void elv_merged_request(struct request_queue *, struct request *, int);
  106. extern void elv_dequeue_request(struct request_queue *, struct request *);
  107. extern void elv_requeue_request(struct request_queue *, struct request *);
  108. extern int elv_queue_empty(struct request_queue *);
  109. extern struct request *elv_next_request(struct request_queue *q);
  110. extern struct request *elv_former_request(struct request_queue *, struct request *);
  111. extern struct request *elv_latter_request(struct request_queue *, struct request *);
  112. extern int elv_register_queue(struct request_queue *q);
  113. extern void elv_unregister_queue(struct request_queue *q);
  114. extern int elv_may_queue(struct request_queue *, int);
  115. extern void elv_abort_queue(struct request_queue *);
  116. extern void elv_completed_request(struct request_queue *, struct request *);
  117. extern int elv_set_request(struct request_queue *, struct request *, gfp_t);
  118. extern void elv_put_request(struct request_queue *, struct request *);
  119.  
  120. /*
  121.  * io scheduler registration
  122.  */
  123. extern void elv_register(struct elevator_type *);
  124. extern void elv_unregister(struct elevator_type *);
  125.  
  126. /*
  127.  * io scheduler sysfs switching
  128.  */
  129. extern ssize_t elv_iosched_show(struct request_queue *, char *);
  130. extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t);
  131.  
  132. extern int elevator_init(struct request_queue *, char *);
  133. extern void elevator_exit(elevator_t *);
  134. extern int elv_rq_merge_ok(struct request *, struct bio *);
  135.  
  136. /*
  137.  * Helper functions.
  138.  */
  139. extern struct request *elv_rb_former_request(struct request_queue *, struct request *);
  140. extern struct request *elv_rb_latter_request(struct request_queue *, struct request *);
  141.  
  142. /*
  143.  * rb support functions.
  144.  */
  145. extern struct request *elv_rb_add(struct rb_root *, struct request *);
  146. extern void elv_rb_del(struct rb_root *, struct request *);
  147. extern struct request *elv_rb_find(struct rb_root *, sector_t);
  148.  
  149. /*
  150.  * Return values from elevator merger
  151.  */
  152. #define ELEVATOR_NO_MERGE    0
  153. #define ELEVATOR_FRONT_MERGE    1
  154. #define ELEVATOR_BACK_MERGE    2
  155.  
  156. /*
  157.  * Insertion selection
  158.  */
  159. #define ELEVATOR_INSERT_FRONT    1
  160. #define ELEVATOR_INSERT_BACK    2
  161. #define ELEVATOR_INSERT_SORT    3
  162. #define ELEVATOR_INSERT_REQUEUE    4
  163.  
  164. /*
  165.  * return values from elevator_may_queue_fn
  166.  */
  167. enum {
  168.     ELV_MQUEUE_MAY,
  169.     ELV_MQUEUE_NO,
  170.     ELV_MQUEUE_MUST,
  171. };
  172.  
  173. #define rq_end_sector(rq)    ((rq)->sector + (rq)->nr_sectors)
  174. #define rb_entry_rq(node)    rb_entry((node), struct request, rb_node)
  175.  
  176. /*
  177.  * Hack to reuse the csd.list list_head as the fifo time holder while
  178.  * the request is in the io scheduler. Saves an unsigned long in rq.
  179.  */
  180. #define rq_fifo_time(rq)    ((unsigned long) (rq)->csd.list.next)
  181. #define rq_set_fifo_time(rq,exp)    ((rq)->csd.list.next = (void *) (exp))
  182. #define rq_entry_fifo(ptr)    list_entry((ptr), struct request, queuelist)
  183. #define rq_fifo_clear(rq)    do {        \
  184.     list_del_init(&(rq)->queuelist);    \
  185.     INIT_LIST_HEAD(&(rq)->csd.list);    \
  186.     } while (0)
  187.  
  188. /*
  189.  * io context count accounting
  190.  */
  191. #define elv_ioc_count_mod(name, __val)                \
  192.     do {                            \
  193.         preempt_disable();                \
  194.         __get_cpu_var(name) += (__val);            \
  195.         preempt_enable();                \
  196.     } while (0)
  197.  
  198. #define elv_ioc_count_inc(name)    elv_ioc_count_mod(name, 1)
  199. #define elv_ioc_count_dec(name)    elv_ioc_count_mod(name, -1)
  200.  
  201. #define elv_ioc_count_read(name)                \
  202. ({                                \
  203.     unsigned long __val = 0;                \
  204.     int __cpu;                        \
  205.     smp_wmb();                        \
  206.     for_each_possible_cpu(__cpu)                \
  207.         __val += per_cpu(name, __cpu);            \
  208.     __val;                            \
  209. })
  210.  
  211. #endif /* CONFIG_BLOCK */
  212. #endif
  213.